#层次聚类
'''
凝聚型层次聚类（Agglomerative Clustering）：从单个数据点开始，逐步合并最相似的点，直到形成所需的簇数量。
分裂型层次聚类（Divisive Clustering）：从所有数据点作为一个簇开始，逐步分割，直到每个点成为一个单独的簇。
'''

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage

# 生成数据
X, y = make_blobs(n_samples=300,  # 样本数量
                  centers=4,  # 聚类中心数量
                  random_state=np.random.randint(1, 1000))  # 随机种子

# 创建 AgglomerativeClustering 模型
# n_clusters: 指定最终的簇数量
# linkage: 指定簇之间的距离计算方式，可选 'ward', 'complete', 'average', 'single'
model = AgglomerativeClustering(n_clusters=4, linkage='ward')

# 拟合数据并获取簇标签
labels = model.fit_predict(X)

fig, ax = plt.subplots(2, 1, figsize=(10, 10))

# 可视化聚类结果
ax[0].scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', edgecolors='k')
ax[0].set_title("Agglomerative Clustering Result")

# 绘制树状图
linked = linkage(X, method='ward')
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True,ax=ax[1])
ax[1].set_title("Dendrogram")
ax[1].set_xlabel("Data Points")
ax[1].set_ylabel("Distance")


# 调整子图之间的间距
plt.tight_layout()

plt.show()